package kim.bat.utils.mvi

import kotlinx.coroutines.flow.Flow

/**
 * MVI：Intent → Action → Effect → Actor → Result → Reducer → State
 * 事件（Event）与状态（State）分离，UI 只订阅 stateFlow 与 eventsFlow。
 */


/**
 * 流转途径
 * Intent 到 Action 到 Plan
 * Plan 同步 Result 直接归约到 State
 * Plan 异步 Effect 交由 Actor 产生 Result 再归约
 * Event 从 Result 派生 用于一次性通知
 * UI 订阅 stateFlow 和 eventsFlow
 */
interface IUiIntent

/** 归一化后的动作 准备计划与副作用 */
interface IUiAction

/** 副作用意图 交由 Actor 执行 */
interface IUiEffect

/** 结果 数据变化来源 合并到 State */
interface IUiResult

/** 一次性事件 UI 消费后不保留 */
interface IUiEvent

/** 不可变状态 UI 展示所需数据 */
interface IUiState

/** 只做不可变状态变换 无副作用 */
fun interface IUiReducer<S : IUiState, R : IUiResult> {
    fun reduce(prev: S, result: R): S
}

/** 执行 Effect 返回 Flow<Result> 不持有状态 */
interface IUiActor<E : IUiEffect, R : IUiResult> {
    fun execute(effect: E): Flow<R>
}

/** 并发策略 Parallel 并行 ReplaceByKey 取消同键队列 QueueByKey 同键顺延 */
enum class EffectPolicy { Parallel, ReplaceByKey, QueueByKey }

/** 空Event */
object EmptyEvent : IUiEvent

/** 空Intent：用于无需输入的场景 */
object EmptyIntent : IUiIntent

/** Intent/Action 合一：当两者语义一致时可用该接口作为统一类型 */
interface IUiIntentAction : IUiIntent, IUiAction
